#include "CajaPow.h"

const int EstadoCajaPow::Inactiva = 0;
const int EstadoCajaPow::Accionando = 1;
const int EstadoCajaPow::Activa = 2;
const vector<int> EstadoCajaPow::accionesParticulares = make_vector<int>() << EstadoCajaPow::Inactiva;
const vector<string> EstadoCajaPow::descripcionAccionesParticulares = make_vector<string>() << "inactiva";

CajaPow::CajaPow (int x, int y, int maximoX, int maximoY) : ObjetoEstatico(x, y, maximoX, maximoY) {

	tiempoUltimaAccion = 0;
	srand( time(NULL) );
	estadoParticular = EstadoCajaPow::Activa;
	tipo = OBSTACULO;
}

void CajaPow::Powear() {

	if (estadoParticular == EstadoCajaPow::Activa)
		setEstadoParticular(EstadoCajaPow::Accionando);
}

void CajaPow::setEnemigos(vector<ObjetoMovible*> v_movibles) {
	this->v_movibles.clear();
	this->v_movibles = v_movibles;
}

pair<idImagen_t, int> CajaPow::getDibujable(Uint32 time) {

//	cout<<"tamaño movibles: "<<this->v_movibles.size()<<endl;

	if (estadoParticular == EstadoCajaPow::Inactiva && time - tiempoUltimaAccion > LAPSUS_MINIMO_POW_INACTIVO)
		setEstadoParticular(EstadoCajaPow::Activa);

	if (estadoParticular == EstadoCajaPow::Accionando) {
		for (unsigned int j=0; j<v_movibles.size(); j++) {
			if (v_movibles.at(j)->getTipo() == ENEMIGO) {
				if (v_movibles.at(j)->getPrioridad() == 1) static_cast<Hongo*> (v_movibles.at(j))->Detener();
				else if (v_movibles.at(j)->getPrioridad() == 2) static_cast<Tortuga*> (v_movibles.at(j))->SepararCaparazon();
				else if (v_movibles.at(j)->getPrioridad() == 4) static_cast<Bomba*> (v_movibles.at(j))->PutOnDetone();
			}
		}

		tiempoUltimaAccion = time;
		setEstadoParticular(EstadoCajaPow::Inactiva);
	}

	pair<idImagen_t, int> dibujable;

	if (estadoParticular == EstadoCajaPow::Activa) {
		dibujable = ObjetoEstatico::getDibujable(time);
	}
	else if (estadoParticular == EstadoCajaPow::Inactiva) {
		bool status;
		/****************************************************************************************************************/
		/*********************************** ACA ROMPE PORQUE NO ENCUENTRA IMAGEN PARA EL ESTADO INACTIVO ***************/
		dibujable = getDibujableParticular(accionesParticulares.at(estadoParticular), time, &status);
	}
	return dibujable;
}

void CajaPow::setEstadoParticular(int estadoParticular) {

	this->estadoParticular = estadoParticular;
}

void CajaPow::addAccionParticular(int idImagen, int cuadros) {
	Animacion *animacion = new Animacion (cuadros, 0, idImagen, ancho, alto);
    accionesParticulares.push_back(animacion);
}

void CajaPow::ColisionarConPersonaje(ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {

	Personaje* per = dynamic_cast<Personaje*> (personaje);

	per->StartSonido (SonidosPersonaje::ColisionObstaculo);

	int ZONA_COLISION_X = per->getAncho() * 0.1;
	int ZONA_COLISION_Y = per->getAlto() * 0.1;

	if (colXvieja != 0) {
		if (per->getVelocidadY() <= 0) {
			per->setVelocidadY(0);
			if (per->getEstado() == EstadoBasico::Saltando) per->setEstado(EstadoBasico::Quieto);
			per->setPosicion(per->getX(), getY() - per->getAlto());
		}
		else {
			Powear();
			per->setVelocidadY(per->getVelocidadY() * (-1));
			per->setPosicion(per->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else if (colYvieja !=0) {
		if (per->getVelocidadX() < 0) per->setPosicion(getX() + getAncho() - ZONA_COLISION_X, per->getY());
		else per->setPosicion(getX() - per->getAncho() + ZONA_COLISION_X, per->getY());
	}
	else {
		if (colX >= colY) {
			if (per->getVelocidadY() < 0) {
				per->setVelocidadY(0);
				if (per->getEstado() == EstadoBasico::Saltando) per->setEstado(EstadoBasico::Quieto);
				per->setPosicion(per->getX(), getY() - per->getAlto());
			}
			else {
				Powear();
				per->setVelocidadY(per->getVelocidadY() * (-1));
				per->setPosicion(per->getX(), getY() + getAlto() - ZONA_COLISION_Y);
			}
		}
		else {
			if (per->getVelocidadX() < 0) per->setPosicion(getX() + getAncho() - ZONA_COLISION_X, per->getY());
			else per->setPosicion(getX() - per->getAncho() + ZONA_COLISION_X, per->getY());
		}
	}
}

void CajaPow::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {

	ObjetoMovible* mov = dynamic_cast<ObjetoMovible*> (movible);

	int ZONA_COLISION_Y = mov->getAlto() * 0.1;

	if (colXvieja != 0) {
		if (mov->getVelocidadY() <= 0) {
			mov->setVelocidadY(0);
			mov->setPosicion(mov->getX(), getY() - mov->getAlto());
			if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
		}
		else {
			mov->setVelocidadY(mov->getVelocidadY() * (-1));
			mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else if (colYvieja !=0 ) mov->CambiarSentido(getX(), getAncho());

	else {
		if (colX >= colY) {
			if (mov->getVelocidadY() < 0) {
				mov->setVelocidadY(0);
				mov->setPosicion(mov->getX(), getY() - mov->getAlto());
				if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
			}
			else {
				mov->setVelocidadY(mov->getVelocidadY() * (-1));
				mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
			}
		}
		else mov->CambiarSentido(getX(), getAncho());
	}
}
